package com.cc.pokergame;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.cc.pokergame.databinding.ActivityLoginRegisterBinding;
import com.cc.pokergame.databinding.ChoosePhotoBottomSheetDialogBinding;
import com.cc.pokergame.utils.AnimatorUtils;
import com.cc.pokergame.utils.SystemUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class LoginRegisterActivity extends AppCompatActivity {
    private ActivityLoginRegisterBinding loginRegisterBinding;

    // 记录登录注册状态
    private LoginRegisterState state = LoginRegisterState.LOGIN;
    // 获取最大顶部内间距
    private int maxTopMargin;

    // 保存拍照图片uri
    private Uri photoUri;

    // 创建页面跳转申请的启动器对象
    private ActivityResultLauncher<Intent> cameraPermissionLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            // 返回ActivityResult对象
            result -> {
                // 获取到Intent数据
                Intent resultData = result.getData();
                // 判断是否操作成功 并且 返回的Intent数据不为空
                if (result.getResultCode() == RESULT_OK && resultData != null) {
                    // 获取到相册中图片的url
                    photoUri = resultData.getData();
                    //loginRegisterBinding.voide.setImageURI(selectedImage);

                    // 使用glide加载图片
                    Glide.with(this)
                         .load(photoUri)
                         .into(loginRegisterBinding.voide);
                    // 需要将外部的Uri对于的图片写入到filesDir目录下
                    saveImageToFilesDir(photoUri);
                    checkButtonState();
                }
            });

    /**
     * 将图片Uri保存到应用磁盘上
     * 这里需要用到输入输出流，这里的输入输出是相对于内存
     * @param uri uri地址
     */
    private void saveImageToFilesDir(Uri uri) {
        try {
            // 输入
            // 使用内容解析器，调用openInputStream打开输入流
            InputStream openInputStream = getContentResolver().openInputStream(uri);

            // 内存
            // 定义一个字节数组
            byte[] buffer = new byte[1024];
            // 记录每次读了多少字节
            int len = 0;

            // 输出
            File file = new File(getFilesDir(), "head.jpeg");
            if (!file.exists()){
                // 没有文件就创建文件
                file.createNewFile();
            }
            FileOutputStream outputStream = new FileOutputStream(file);

            // 输入流写到内存
            while (true){
                // 一次读取1024个字节
                len = openInputStream.read(buffer, 0, 1024);
                // 当数据读完返回-1时跳出循环
                if (len == -1) {
                    break;
                }
                // 输出流
                outputStream.write(buffer, 0, len);
            }
            // 关闭资源
            openInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 创建图片权限申请的启动器对象
    private final ActivityResultLauncher<String> photoPermissionLauncher = registerForActivityResult(
            new ActivityResultContracts.RequestPermission(),
            // 返回Boolean值；true->有权限，false->没有权限
            isGranted -> {
                if (isGranted) {
                    showBottomSheetDialog();
                } else {
                    Toast.makeText(this, "需要相机权限才能拍照", Toast.LENGTH_SHORT).show();
                }
            });

    // 创建拍摄权限申请的启动器对象
    private final ActivityResultLauncher<Uri> takePhotoPermissionLauncher = registerForActivityResult(
            // 这里通过ActivityResultContracts类中的内部类 继承不同类提供的泛型值，
            // 第一个泛型类型为返回的对象的泛型值，第二个泛型类型为registerForActivityResult的第二个参数回调函数的结果
            new ActivityResultContracts.TakePicture(),
            // 返回Boolean值；true->表示有Uri，false->没有Uri
            isUrl -> {
                // 是否有Uri
                if (isUrl) {
                    // 有Uri
                    /*File file = new File(getFilesDir(), "head.jpg");
                    Uri uri = Uri.fromFile(file);*/

                    // 通过uri修改图片
                    //loginRegisterBinding.voide.setImageURI(photoUri);

                    // 使用glide加载图片
                    Glide.with(this)
                            .load(photoUri)
                            .apply(RequestOptions.circleCropTransform()) // 将图片剪切为圆形
                            .into(loginRegisterBinding.voide);
                    checkButtonState();

                } else {
                    // 没有Uri
                    Toast.makeText(this, "哪里出问题了", Toast.LENGTH_LONG).show();
                }
            });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        loginRegisterBinding = ActivityLoginRegisterBinding.inflate(getLayoutInflater());
        setContentView(loginRegisterBinding.getRoot());

//        changeState();

        maxTopMargin = SystemUtils.dp2px(60, this);


        initEvent();
    }

    /**
     * 点击事件
     */
    public void initEvent() {


        loginRegisterBinding.registerBtn.setOnClickListener(v -> {
            setState(LoginRegisterState.REGISTER);
            changeState();
        });

        loginRegisterBinding.button.setOnClickListener(v -> {
            /*setState(LoginRegisterState.LOGIN);
            changeState();*/

            if (state == LoginRegisterState.LOGIN){
                login();
            }else {
                register();
            }
        });

        // 图片点击事件
        loginRegisterBinding.voide.setOnClickListener(v -> {
            // 获取当前是否有相机访问权限
            // 如果在Activity类中可以直接使用checkSelfPermission方法，不在Activity类中用ActivityCompat类调用checkSelfPermission方法
            int result = checkSelfPermission(Manifest.permission.CAMERA);
            // 判断是否有权限
            if (result == PackageManager.PERMISSION_GRANTED) {
                // 有权限
                showBottomSheetDialog();


            } else {
                photoPermissionLauncher.launch(Manifest.permission.CAMERA);
            }
        });


        // 监听输入框输入事件
        loginRegisterBinding.inputUserName.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // 修改前
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // 修改中
            }

            @Override
            public void afterTextChanged(Editable s) {
                // 修改后
                checkButtonState();
            }
        });
        // 监听输入框输入事件
        loginRegisterBinding.inputPassword.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // 修改前
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // 修改中
            }

            @Override
            public void afterTextChanged(Editable s) {
                // 修改后
                checkButtonState();
            }
        });

    }


    /**
     * 检查按钮状态
     */
    private void checkButtonState(){
        // 检查输入框中是否有内容
        if (loginRegisterBinding.inputUserName.getText().length() == 0 || loginRegisterBinding.inputPassword.getText().length() == 0 ){
            loginRegisterBinding.button.setEnabled(false);
            return;
        }

        // 判断当前处于什么状态
        if (state == LoginRegisterState.REGISTER){
            // 如果处于注册状态，需要判断头像是否为空
            if (photoUri == null) {
                loginRegisterBinding.button.setEnabled(false);
                return;
            }
        }

        // 以上都不为空表示可以点击
        loginRegisterBinding.button.setEnabled(true);
    }

    // 从设备底部弹出菜单
    private void showBottomSheetDialog() {
        // 使用AlertDialog对象，返回builder对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        // 在Activity对象中得到解析器，解析自定的xml文件
        ChoosePhotoBottomSheetDialogBinding dialogBinding = ChoosePhotoBottomSheetDialogBinding.inflate(getLayoutInflater());
        // 设置view，在builder对象中设置组件属性，可以自定义视图
        builder.setView(dialogBinding.getRoot());
        // 构建AlertDialog对象
        AlertDialog alertDialog = builder.create();
        // 设置弹窗的位置，设置在屏幕底部
        alertDialog.getWindow().setGravity(Gravity.BOTTOM);
        // 显示弹窗
        alertDialog.show();

        dialogBinding.cameraBtn.setOnClickListener(v -> {
            // 创建自己的文件路径
            File filesDir = getFilesDir();
            // 拼接文件的名称，得到完整的文件路径
            File file = new File(filesDir, "head.jpeg");

            // 创建文件
            try {
                if (!file.exists()){
                    file.createNewFile();
                }
            }catch (IOException e){
                throw new RuntimeException(e);
            }

            // 获取拍照图片的uri
            photoUri = FileProvider.getUriForFile(
                    this,
                    "com.cc.pokergame.fileprovider",
                    file
            );
            // 将uri交给
            takePhotoPermissionLauncher.launch(photoUri);
        });
        dialogBinding.libraryBtn.setOnClickListener(v -> {
            // 隐式跳转，跳转到相册选择图片
            Intent intent = new Intent(Intent.ACTION_VIEW, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            cameraPermissionLauncher.launch(intent);
        });
        dialogBinding.cancelBtn.setOnClickListener(v -> {
            // 取消按钮
            alertDialog.dismiss();
        });


        /* BottomSheetDialog组件
        // 创建底部弹窗组件
        BottomSheetDialog dialog = new BottomSheetDialog(this);
        // 设置弹框组件属性，可以自定义视图；不交互时->使用R.layout.只为显示，要做交互时->使用view
        dialog.setContentView(R.layout.choose_photo_bottom_sheet_dialog);
        // 显示弹框
        dialog.show();
        // 隐藏弹框 dialog.dismiss();*/

    }

    /**
     * 根据不同的状态实现不同的功能
     */
    public void changeState() {
        // 输入框清空
        loginRegisterBinding.inputUserName.getText().clear();
        loginRegisterBinding.inputPassword.getText().clear();

        if (state == LoginRegisterState.LOGIN) {

            // 移除头像控件
            loginRegisterBinding.voide.setVisibility(View.INVISIBLE);
            loginRegisterBinding.button.setText("登录");
            // 显示提示信息
            loginRegisterBinding.massage.setVisibility(View.VISIBLE);
            scaleHeightAnimation(true);
        } else {

            loginRegisterBinding.voide.setVisibility(View.VISIBLE);
            loginRegisterBinding.button.setText("注册");
            loginRegisterBinding.massage.setVisibility(View.INVISIBLE);

            scaleHeightAnimation(false);
            Glide.with(this)
                    .load(R.drawable.voide)
                    .into(loginRegisterBinding.voide);
            photoUri = null;
        }
    }

    /**
     * 登录事件
     */
    private void login(){
        SharedPreferences sp = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
        String name = sp.getString("name", "");
        String password = sp.getString("password", "");

        if (name.equals(loginRegisterBinding.inputUserName.getText().toString().trim()) && password.equals(loginRegisterBinding.inputPassword.getText().toString().trim())) {
            // 登录成功
            Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, HomeActivity.class);
            startActivity(intent);
            overridePendingTransition(R.anim.anim_in, R.anim.anim_out); // 页面跳转动画
        }else {
            Toast.makeText(this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 注册事件
     */
    private void register(){
        // 保存用户的注册信息
        // 获取到系统的sharedPreferences(文件名，模式类型)
        SharedPreferences sp = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
        // 获取Editor编辑对象，实现键值对保存（只能保存基本数据类型）
        SharedPreferences.Editor editor = sp.edit();
        // 以key-value的形式保存信息，给字符串提供.trim()去掉空格
        editor.putString("name", loginRegisterBinding.inputUserName.getText().toString().trim());
        editor.putString("password", loginRegisterBinding.inputPassword.getText().toString().trim());
        editor.putString("headName", "head.jpeg"); // 保存头像名称
        editor.putInt("money", 50000); // 初始化金币
        // 提交信息，这里建议使用apply来提交
        //editor.commit(); // 阻塞当前线程
        editor.apply(); // 异步处理
        Toast.makeText(this, "注册成功，前往登录", Toast.LENGTH_SHORT).show();

        // ...
        setState(LoginRegisterState.LOGIN);
        changeState();
    }

    /**
     * 通过传过来的boolean做不同的动画
     * @param isFlag true->登录状态，false->注册状态
     */
    public void scaleHeightAnimation(boolean isFlag) {
        if (isFlag) {
            AnimatorUtils.scale(loginRegisterBinding.voide, 1f, 0f);
            AnimatorUtils.scaleTop(loginRegisterBinding.bgConstraint, 0, maxTopMargin);
        } else {
            AnimatorUtils.scale(loginRegisterBinding.voide, 0f, 1f);
            AnimatorUtils.scaleTop(loginRegisterBinding.bgConstraint, maxTopMargin, 0);
        }

    }

    /**
     * 修改登录注册状态
     * @param state 修改后的状态
     */
    public void setState(LoginRegisterState state) {
        this.state = state;
    }

    // 登录注册状态
    public enum LoginRegisterState {
        LOGIN, // 登录
        REGISTER // 注册
    }
}